#ifndef SGU_STATS_H
#define SGU_STATS_H

SGU_NS_BEGIN


class Stat 
{
	public:
 
	enum Compute    // richiede di calcolare solo alcune informazioni
	{
		SUM = 1,     // somma
		SUM2 = 2,    // somma dei quadrati
		MINMAX = 4,  // minimo e massimo

		SIGMA = SUM|SUM2,
		ALL = SIGMA|MINMAX
	};

	Stat(Compute);

	void add(real);              /// aggiunge un valore al set
	int count() const;           /// numero di valori
	real sum() const;            /// somma 
	real sum2() const;           /// somma dei quadrati
	real average() const;        /// media
	real average2() const;       /// media dei quadrati
	real min() const;            /// minimo
	real max() const;            /// massimo
	real mid() const;            /// punto medio (massimo+minimo)/2
	real sigma() const;          /// deviazione standard (non campionaria)
	real delta() const;          /// estenzione (massimo-minimo)
	int nMin();                  /// indice del primo valore minimo
	int nMax();                  /// indice del primo valore massimo

	void clear();                /// cancella tutti i valori accumulati


	protected:
	int _count;
	real _sum;
	real _qsum;
	real _min;
	real _max;
	int _nMin;
	int _nMax;
	Compute _ops;

};


class Stat2D 
{
	public:
	Stat2D();

	void add(const Vector2D &);         // aggiunge un vettore al set
	int count() const;                  // numero di vettori
	const Vector2D sum() const;               // somma di tutti i vettori
	real sum2() const;                  // somme dei quadrati delle norme di tutti i vettori
	const Vector2D average() const;           // vettore medio (Sum()/Count())
	real average2() const;              // media dei quadrati delle norme dei vettori
	real sigma() const;                 // devizione standard (vedi sorgente per formula)

	void clear();          // cancella tutti i vettori accumulati

	protected:
	int _count;
	Vector2D _sum;
	real _qsum;

};


class Stat3D
{
	public:

	Stat3D();

	void add(const Vector3D &);         // aggiunge un vettore al set
	int count() const;                  // numero di vettori
	const Vector3D sum() const;               // somma di tutti i vettori
	real sum2() const;                  // somme dei quadrati delle norme di tutti i vettori
	const Vector3D average() const;           // vettore medio (Sum()/Count())
	real average2() const;              // media dei quadrati delle norme dei vettori
	real sigma() const;                 // devizione standard (vedi sorgente per formula)

	void clear();          // cancella tutti i vettori accumulati

	protected:
	int _count;
	Vector3D _sum;
	real _qsum;


};

SGU_NS_END

#endif

